//
//  CJUserAccountViewModel.swift
//  SinaWeibo
//
//  Created by 程建 on 16/9/25.
//  Copyright © 2016年 itcast. All rights reserved.
//
//  视图模型有可能是 单例对象有可能只是单纯的对象
//  viewmodel: 负责请求网络数据 , 封装数据处理的逻辑 数据的缓存    -> 给控制器减肥

import UIKit

//获取路径
private let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")


class CJUserAccountViewModel: NSObject {

    
    //创建单例对象
    static let shardAccountViewModel: CJUserAccountViewModel = CJUserAccountViewModel()
    /*
     赋值有两种情况
     1.用户未登录
     2.用户已经登入,沙盒中获取
    */
    //模型数据
    var userAccount:CJUserAccount? {
    
        didSet {
            let urlString = userAccount?.avatar_large ?? ""
            iconURL = URL(string: urlString)
        }
    }
    
    //可以使用计算性属性 计算型属性的特点是相当于一个方法 每次执行都会调用 消耗cpu  值如果需要一直变化 就需要使用计算型属性
    //存储型的属性 调用存储型的属性的时候 实际上回直接读取内存 不消耗cpu 但是消耗内存 值一旦设置就不需要变化 就可以使用 存储型属性
    var iconURL: URL?
    
    
    //判断用户是否登入
    var userLogin:Bool {
        
        if userAccount?.access_token != nil && isExpirse == false {
        
            return true
        }
        
        return false
    }
    
    //判断token师傅过期
    var isExpirse:Bool {
        
        if userAccount?.expires_date?.compare(Date()) == ComparisonResult.orderedDescending {
                return false
            }
        
        return true
    }
    
    override init() {
        super.init()
        
        //从沙盒中获取信息
        //在构造函数给属性赋值  不会执行didSet 方法
        self.userAccount = loadUserAccount()
        
        let urlString = userAccount?.avatar_large ?? ""
        iconURL = URL(string: urlString)
        
    }
    
    func loadAccessToken(code:String ,finished:@escaping (Bool)->()) {
        
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        let parameters:[String : Any] = ["client_id" : client_id,
                                         "client_secret" : client_secret,
                                         "grant_type" :"authorization_code",
                                         "code" : code,
                                         "redirect_uri":redirect_uri]
        
        //利用网络请求框架 请求接口POST
        CJNetworkTools.sharedTools.request(method: .POST, urlString: urlString, parameters: parameters) { (responseObject, error) in
            
            if error != nil {
                
                //统一输出
                finished(false)
                return
                
            }
            // print(responseObject);
            
            self.loadUserInfo(dict: responseObject as! [String : Any],finished: finished)
            
        }
        
    }
    
    //根据上面获取的token, 请求用户信息接口,获取用户信息
    func loadUserInfo(dict:[String:Any],finished:@escaping (Bool)->()) {
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        let access_token = dict["access_token"]!
        let uid = dict["uid"]!
        //字典中不能添加nil
        let parameters = ["access_token" : access_token,
                          "uid" : uid]
        
        CJNetworkTools.sharedTools.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
            if error != nil {
                
                //统一输出
                finished(false)
                return
                
            }
            // print(responseObject)
            //获取用户信息 将字典类型的用户信息 转换成模型数据 -> 将模型数据存储在本地(归档)
            //字典转模型
            var userInfoDict = responseObject as! [String:Any]
            
            //合并字典
            for keyValue in dict {
                
                userInfoDict[keyValue.key] = keyValue.value
            }
            
            //字典转模型
            let userAccount = CJUserAccount(dict: userInfoDict)
            //print(userAccount)
            
            //用户模型存储在本地,方便日后以后使用
            self.saveUserAccount(userAccount: userAccount)
            
            //未登入状态 到登入状态,不需要从沙盒中获取信息
            self.userAccount = userAccount
            
            finished(true)
            
        }
        
    }
    
    //通过归档的方式来存储数据
    private func saveUserAccount(userAccount:CJUserAccount) {
        
        //获取路径
        //    let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")
        
        //将某一对象归档到沙盒里
        NSKeyedArchiver.archiveRootObject(userAccount, toFile: path)
        
      //  print(path)
       // print("☺️😝😝😝😝😝😝😝😝😝😝😝😝😝")
        
    }
    
    //解档  从沙盒中加载用户数据
    private func loadUserAccount()->CJUserAccount? {
        
        let userAccount = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? CJUserAccount
        
        return userAccount
    }
    
}
